
import 'package:mybase/mybase.dart';

/**
 * @title 每隔指定的时间mill，执行一次exe，成功，则结束. 失败，则继续执行，直到成功，或者达到maxMill，则结束
 */
class FFTimerTask {
  // 最大时间
  int maxMill;
  // 时间间隔
  int mill;
  /// 注意：exe 不能执行需要等待很久的任务，比如网络请求，要尽量快速的任务
  Future<bool> Function() exe;

  // 是否结束
  bool _dispose = false;
  // 任务开始的时间
  int _beginMill = 0;

  FFTimerTask({
    this.maxMill = 3000,
    this.mill = 300,
    required this.exe,
  });

  /**
   * @title 开始执行
   * @immediately 是否立即执行。true: 立即执行。  false:代表等待一个间隔再执行
   */
  Future<void> start({bool immediately = true}) async {
    _beginMill = FFTime.nowMillSecond();
    if (immediately) {
      await _handle();
    } else {
      await globalAwait(mill: mill);
      await _handle();
    }
  }

  Future<void> _handle() async {
    if (_dispose) return;

    if (FFTime.nowMillSecond() - _beginMill >= maxMill) {
      cancel();
      return;
    }

    if (_dispose) return;

    bool result = await exe();
    if (result) {
      cancel();
      return;
    }

    await globalAwait(mill: mill);
    await _handle();
  }

  cancel() {
    _dispose = true;
    FFLog.info("任务结束");
  }
}
